#include "webview.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#ifdef __APPLE__
#include <mach-o/dyld.h> // macOS 系统
#include <unistd.h>      // 添加 getcwd 函数的头文件
#ifdef HIDE_CONSOLE
#include "mac_bundle_utils.h" // 使用我们的辅助函数
#endif
#elif defined(_WIN32)
#include <windows.h>     // Windows 系统
#include <direct.h>      // Windows 下的 getcwd 函数
#else
#include <unistd.h>      // Linux/Unix 系统
#endif

// 获取可执行文件所在目录
char* get_executable_dir() {
    char* path = NULL;
    
#ifdef __APPLE__
    // macOS 实现
    char buffer[1024];
    uint32_t size = sizeof(buffer);
    
    if (_NSGetExecutablePath(buffer, &size) == 0) {
        printf("可执行文件路径: %s\n", buffer);
        
        // 获取目录部分
        char* last_slash = strrchr(buffer, '/');
        if (last_slash) {
            *last_slash = '\0';
            path = strdup(buffer);
            printf("提取的目录: %s\n", path);
        } else {
            printf("无法从路径提取目录\n");
            path = strdup(".");
        }
    } else {
        printf("_NSGetExecutablePath 失败，路径缓冲区太小\n");
        path = strdup(".");
    }
#elif defined(_WIN32)
    // Windows 实现
    char buffer[MAX_PATH];
    if (GetModuleFileNameA(NULL, buffer, MAX_PATH) > 0) {
        printf("可执行文件路径: %s\n", buffer);
        
        // 将反斜杠转换为正斜杠
        for (char* p = buffer; *p; p++) {
            if (*p == '\\') *p = '/';
        }
        
        // 获取目录部分
        char* last_slash = strrchr(buffer, '/');
        if (last_slash) {
            *last_slash = '\0';
            path = _strdup(buffer);
            printf("提取的目录: %s\n", path);
        } else {
            printf("无法从路径提取目录\n");
            path = _strdup(".");
        }
    } else {
        printf("GetModuleFileName 失败: %lu\n", GetLastError());
        path = _strdup(".");
    }
#else
    // Linux 实现
    char buffer[1024];
    ssize_t len = readlink("/proc/self/exe", buffer, sizeof(buffer) - 1);
    
    if (len != -1) {
        buffer[len] = '\0';
        printf("可执行文件路径: %s\n", buffer);
        
        // 获取目录部分
        char* last_slash = strrchr(buffer, '/');
        if (last_slash) {
            *last_slash = '\0';
            path = strdup(buffer);
            printf("提取的目录: %s\n", path);
        } else {
            printf("无法从路径提取目录\n");
            path = strdup(".");
        }
    } else {
        printf("readlink 失败: %s\n", strerror(errno));
        path = strdup(".");
    }
#endif

    if (!path) {
        printf("内存分配失败，使用当前目录\n");
        path = strdup(".");
    }
    
    return path;
}

int main(int argc, char* argv[]) {
    // 初始化应用
    webview_init();
    
    WebViewConfig config = {
        .width = 800,
        .height = 600,
        .x = 0,    // 设为0，让窗口自动居中
        .y = 0,
        .alpha = 1.0f,
        .borderless = 1,        // 启用无边框模式
        .transparent = 1,       // 启用透明背景
        .title = "自定义窗口",
        .hide_scrollbars = 1,   // 启用滚动条隐藏
        .resizable = 1          // 启用大小调整
    };
    
    CustomWebView* webview = webview_create(config);
    
    // 构建HTML文件路径
    char html_path[1024] = {0};
    
#if defined(__APPLE__) && defined(HIDE_CONSOLE)
    // 在 macOS 应用程序包中查找资源
    const char* html_file_path = get_bundle_resource_file_path("index.html");
    if (html_file_path) {
        printf("HTML 文件路径: %s\n", html_file_path);
        strncpy(html_path, html_file_path, sizeof(html_path) - 1);
        free((void*)html_file_path);
    } else {
        // 回退到资源目录
        const char* resPath = get_bundle_resource_path();
        if (resPath) {
            printf("应用程序资源路径: %s\n", resPath);
            snprintf(html_path, sizeof(html_path), "%s/index.html", resPath);
            free((void*)resPath);
        } else {
            // 最后回退到可执行文件目录
            char* exe_dir = get_executable_dir();
            snprintf(html_path, sizeof(html_path), "%s/index.html", exe_dir);
            free(exe_dir);
        }
    }
#else
    // 标准模式，使用可执行文件目录
    char* exe_dir = get_executable_dir();
    if (!exe_dir) {
        printf("无法获取可执行文件目录\n");
        return 1;
    }
    
    // 打印当前工作目录
    char cwd[1024];
    if (getcwd(cwd, sizeof(cwd)) != NULL) {
        printf("当前工作目录: %s\n", cwd);
    } else {
        printf("无法获取当前工作目录\n");
    }
    
    // 列出当前目录下的文件
    printf("当前目录文件列表:\n");
    #ifdef _WIN32
    system("dir");
    #else
    system("ls -la");
    #endif
    
    snprintf(html_path, sizeof(html_path), "%s/index.html", exe_dir);
    free(exe_dir);
#endif
    
    // 检查文件是否存在
    FILE* file = fopen(html_path, "r");
    if (file) {
        fclose(file);
        printf("找到HTML文件: %s\n", html_path);
        
        // 获取绝对路径
        char abs_path[1024] = {0};
        #ifdef _WIN32
        _fullpath(abs_path, html_path, sizeof(abs_path));
        #else
        realpath(html_path, abs_path);
        #endif
        
        printf("HTML文件绝对路径: %s\n", abs_path);
        
        // 加载HTML文件
        webview_load_html_file(webview, html_path);
    } else {
        printf("错误: 无法找到HTML文件: %s\n", html_path);
        printf("请确保index.html文件位于正确位置\n");
        
        // 使用内嵌HTML作为备用方案
        const char* html = "无法加载HTML文件";
        webview_load_html(webview, html);
    }
    
    // 设置拖拽区域
    webview_set_drag_region(webview, "#drag-region");
    
    webview_show(webview);
    
    printf("应用程序已启动...\n");
    
    // 运行事件循环
    webview_run();
    
    // 注意：这里实际上永远不会执行到，因为程序会在事件循环中保持运行
    webview_destroy(webview);
    return 0;
} 